<?php
/**
 * PSR-4规范了如何指定文件路径从而自动加载类定义
 * PSR-4的精髓是把命名空间的前缀和文件系统目录对应起来
 * User: Administrator
 * Time: 2015/12/14 19:01
 */

class autoLoader{

	private static $map = array();
	private static $instance;

	private function __construct(){
		spl_autoload_register(array($this,'loadClass'));
	}

	/**
	 * 获取加载器
	 * @return autoLoader
	 */
	public static function getLoader(){
		if(!self::$instance){
			self::$instance = new self();
		}
		return self::$instance;
	}

	/**
	 * 添加命名空间与目录映射
	 * @param $prefix
	 * @param $path
	 */
	public static function addNameSpace($prefix,$path){
		$prefix = rtrim($prefix,'\\').'\\';
		self::$map[$prefix] = $path;
	}

	/**
	 * 加载类
	 * @param $class
	 * @return bool
	 */
	public function loadClass($class){
		$pos = strrpos($class,'\\');
		//获取类名与命名空间
		$class_name = substr($class,$pos+1);
		$namespace = substr($class,0,$pos+1);

		//遍历映射表尝试加载文件
		foreach(self::$map as $prefix => $path){
			$len = strlen($prefix);
			if(strncmp($namespace,$prefix,$len) === 0){
				$namespace = ltrim($namespace,$prefix);
				$path = ltrim($path,'/').'/'.str_replace('\\','/',$namespace).$class_name.'.php';
				if(file_exists($path)){
					require($path);
					break;
				}
			}
		}
		return false;
	}
}

$loader = autoLoader::getLoader();

$loader->addNameSpace('Sjm\Leo','src');

$course = new Sjm\Leo\Think\Page\Course();
$course->test();